// Author: wsfuyibing <682805@qq.com>
// Date: 2025-04-25

package kind

import (
	"context"
	"fmt"
	"gitee.com/go-libs/redis"
	"math/rand"
	"time"
)

// OrderNo
// 订单编号.
type OrderNo string

const (
	OrderNoUndefined OrderNo = ""
)

// NewOrderNo
// 生成订单号.
func NewOrderNo(ctx context.Context, retries ...int) OrderNo {
	// 1. 生成编号.
	//    a. 12个时间字符, 如: 250623195346
	//    b. 8个随机字符, 如: 12345678.
	nb := fmt.Sprintf(`%s%08d`,
		time.Now().Format("060102150405"),
		rand.Int31n(99999999),
	)

	// 2. 写入缓存.
	//    分布式缓存, 保持秒级的全局唯一.
	if redis.SetNx(ctx, nb, nb, 30).IsOk() {
		return OrderNo(nb)
	}

	// 3. 重试次数.
	n := 0
	if len(retries) > 0 && retries[0] > 0 {
		n = retries[0]
	}

	// 3.1 忽略校验.
	//     如果连续3次失败时忽略校验, 由下流业务触发数据库重复错误.
	if n >= 2 {
		return OrderNo(nb)
	}

	// 4. 重新生成.
	//    第0, 1, 2次
	return NewOrderNo(ctx, n+1)
}

func (o OrderNo) IsUndefined() bool {
	return o == OrderNoUndefined
}
